/**
 * @Author: cest
 * @Date: 2022-08-03 14:37:50
 * @LastEditTime: 2022-08-05 18:11:51
 * @LastEditors: cest
 * @FilePath: /vue3-todo-list/src/store/modules/todo.js
 * @Description: 编辑描述内容
 */

const TODOS = [
  { id: '1638256190206', name: '敲代码', done: true },
  { id: '1638256191770', name: '整理笔记', done: false },
  { id: '1638256193996', name: '吃饭', done: false }
]

const DONETODOS = ['1638256190206']

export const MAP = {
  NAMESPACED: 'todo',
  TODO_LIST: 'TODO_LIST',
  TODO_LIST_LENGTH: 'TODO_LIST_LENGTH',
  DONE_TODO_LIST: 'DONE_TODO_LIST',
  FIRST_NAME: 'FIRST_NAME',
  LAST_NAME: 'LAST_NAME',
  FULL_NAME: 'FULL_NAME',
  ADD: 'ADD',
  EXISTS_NAME: 'EXISTS_NAME',
  DELETE: 'DELETE',
  UPDATE: 'UPDATE',
  CHECK_ALL_TODO: 'CHECK_ALL_TODO',
  REVERSE_TODO_DONE: 'REVERSE_TODO_DONE',
  CLEAR_ALL_DONE: 'CLEAR_ALL_DONE',
  RESET_TODOS: 'RESET_TODOS'
}

const state = {
  [MAP.TODO_LIST]: TODOS,
  [MAP.DONE_TODO_LIST]: DONETODOS,
  [MAP.FIRST_NAME]: '不三',
  [MAP.LAST_NAME]: '丁'
}
const getters = {
  [MAP.FULL_NAME]: pState => pState[MAP.LAST_NAME] + pState[MAP.FIRST_NAME],
  [MAP.TODO_LIST_LENGTH]: pState => pState[MAP.TODO_LIST].length
}
const mutations = {
  /**
   * 添加 todo
   * @param {*} pState Proxy State
   * @param {*} payload  todo
   */
  [MAP.ADD](pState, payload) {
    // console.log('ADD: state', state)
    console.log('ADD: pState', pState)
    console.log('ADD: payload', payload)
    pState[MAP.TODO_LIST].unshift(payload)
  },
  /**
   * 删除 todo
   * @param {*} pState Proxy State
   * @param {*} payload todo
   */
  [MAP.DELETE](pState, { id }) {
    // console.log('ADD: state', state)
    console.log('DELETE: pState', pState)
    console.log('DELETE: payload', id)
    pState[MAP.TODO_LIST] = pState[MAP.TODO_LIST].filter(todo => todo.id !== id)
    pState[MAP.DONE_TODO_LIST].splice(pState[MAP.DONE_TODO_LIST].indexOf(id), 1)
  },

  /**
   * 更新 todo
   * @param {*} pState Proxy State
   * @param {*} payload
   */
  [MAP.UPDATE](pState, { doneTodoList = [] }) {
    console.log('UPDATE: pState', pState)
    console.log('UPDATE: payload', doneTodoList)

    pState[MAP.DONE_TODO_LIST] = doneTodoList
    pState[MAP.TODO_LIST] = Array.from(pState[MAP.TODO_LIST], todo => ({
      ...todo,
      done: doneTodoList.includes(todo.id)
    }))
  },

  // 全选
  [MAP.CHECK_ALL_TODO](pState, checked) {
    pState[MAP.TODO_LIST] = Array.from(pState[MAP.TODO_LIST], todo => ({
      ...todo,
      done: checked
    }))
    pState[MAP.DONE_TODO_LIST] = checked
      ? Array.from(pState[MAP.TODO_LIST], todo => todo.id) : Array.from([])
  },

  // 反选
  [MAP.REVERSE_TODO_DONE](pState) {
    pState[MAP.TODO_LIST] = pState[MAP.TODO_LIST].map(todo => ({
      ...todo,
      done: !todo.done
    }))
    pState[MAP.DONE_TODO_LIST] = pState[MAP.TODO_LIST]
      .filter(todo => todo.done === true)
      .map(todo => todo.id)
  },

  // 清除已完成
  [MAP.CLEAR_ALL_DONE](pState) {
    pState[MAP.TODO_LIST] = pState[MAP.TODO_LIST].filter((todo) => !todo.done);
    pState[MAP.DONE_TODO_LIST] = Array.from([])
  },

  // 重置 todo
  [MAP.RESET_TODOS](pState) {
    pState[MAP.TODO_LIST] = Array.from(TODOS)
    pState[MAP.DONE_TODO_LIST] = Array.from(DONETODOS)
  },
}

const actions = {
  /**
   * 名字重复校验
   * @param {*} ctx
   * @param {*} name
   */
  [MAP.EXISTS_NAME](ctx, name) {
    // console.log('ADD: state', state)
    console.log('ADD: ctx', ctx)
    console.log('ADD: name', name)
    return new Promise(resolve => {
      resolve(ctx.state[MAP.TODO_LIST].some(item => item.name === name))
    })
  }
}
export default {
  namespaced: true,
  state,
  getters,
  mutations,
  actions
}
